home *** CD-ROM | disk | FTP | other *** search
- 1 '---------------------------------------------------------
- 2 ' SAMPLE PROGRAM USING KEYED ACCESS ROUTINES -
- 3 ' --------------------------------------------------------
- 5 UA$="A" ' .. DRIVE CONTAINING DATA
- 16 OPEN "R",#2,UA$+":DATA.EMP",84 ' .. OPEN DATA FILE
- 17 FIELD #2, 9 AS KY$, 20 AS NM$, 6 AS BD$, 1 AS SX$, 3 AS JC$, 20 AS A1$, 20 AS A2$, 5 AS ZP$
- 18 '
- 19 ' KY$ - ZIP CODE (KEY) JC$ - JOB CODE
- 20 ' NM$ - NAME A1$ - STREET ADDR.
- 21 ' BD$ - BIRTH DATE A2$ - CITY-STATE
- 22 ' SX$ - SEX ZP$ - ZIP CODE
- 23 '
- 25 MX%=150: F1$="PTR.EMP" ' ..INDEX FILE NAME
- 30 II%=1: GOSUB 2000 ' ..INITIALIZE DATA STRUCTURE
- 31 '
- 32 INPUT "OPERATION (D,A,L,S,LA,U,Q)";Q$
- 33 IF Q$="D" THEN GOSUB 150: GOTO 32 ' DELETE
- 34 IF Q$="L" THEN GOSUB 180: GOTO 32 ' LIST INDIVIDUAL DATA
- 35 IF Q$="A" THEN GOSUB 100: GOTO 32 ' ADD
- 36 IF Q$="S" THEN II%=8: GOSUB 2000: GOTO 32 ' DISPLAY STATISTICS
- 37 IF Q$="LA"THEN GOSUB 200: GOTO 32 ' LIST ALL RECORDS
- 38 IF Q$="U" THEN GOSUB 250: GOTO 32 ' UPDATE RECORD
- 40 IF Q$<>"Q" THEN 32
- 50 CLOSE: END
- 97 '
- 98 ' ***** ADD RECORD
- 99 '
- 100 INPUT "SS#";A$ : IF A$="END" THEN 120 ELSE IF LEN(A$)<>9 THEN 100
- 101 II%=5:GOSUB 2000: IF RC%<>0 THEN LSET KY$=A$: GOTO 102 ELSE PRINT"** ERROR - KEY ALREADY EXISTS": GOTO 100
- 102 INPUT "NAME";F$: LSET NM$=F$
- 105 INPUT "BIRTH DATE";F$: LSET BD$=F$
- 107 INPUT "SEX";F$: LSET SX$=F$
- 109 INPUT "JOB CODE";F$: LSET JC$=F$
- 110 INPUT "STREET";F$: LSET A1$=F$
- 111 INPUT "CITY-STATE";F$: LSET A2$=F$
- 112 INPUT "ZIP CODE";F$: LSET ZP$=F$
- 115 II%=2: GOSUB 2000 '.. ADD RECORD
- 116 IF RC%=0 THEN 100 ELSE PRINT"** ERROR - RECORD CANNOT BE STORED": GOTO 100
- 120 II%=7: GOSUB 2000 '.. STORE POINTERS
- 122 RETURN
- 147 '
- 148 ' ***** DELETE RECORD
- 149 '
- 150 ST%=0
- 151 INPUT "CODE TO DELETE";A$: IF A$="END" THEN 156
- 152 II%=4: GOSUB 2000
- 154 IF RC%=0 THEN ST%=1 ELSE PRINT "** ERROR - KEY DOES NOT EXIST"
- 155 GOTO 151
- 156 IF ST%=1 THEN II%=7: GOSUB 2000 ' RESTORE POINTERS IF RECORD DELETED
- 158 RETURN
- 177 '
- 178 ' ***** LIST INDIVIDUAL RECORD
- 179 '
- 180 INPUT "SOCIAL SECURITY NUMBER";A$: IF A$="END" THEN 190
- 182 II%=5: GOSUB 2000: IF RC%<>0 THEN PRINT"**ERROR - KEY DOES NOT EXIST": GOTO 180
- 183 PRINT " "
- 184 PRINT " NAME: ";NM$
- 185 PRINT " JOB CODE: ";JC$
- 186 PRINT "BIRTH DATE: ";LEFT$(BD$,2);"/";MID$(BD$,3,2);"/";RIGHT$(BD$,2)
- 187 PRINT " ADDRESS: ";A1$
- 188 PRINT TAB(13);A2$:PRINT ""
- 189 GOTO 180
- 190 RETURN
- 197 '
- 198 ' ***** LIST RANGE OF RECORDS
- 199 '
- 200 NX%=0: II%=6: K%=0
- 202 NX%=NX%+1: GOSUB 2000
- 204 IF RC%<>0 THEN 210
- 205 PRINT KY$,NM$
- 206 K%=K%+1: IF K%<10 THEN 202 ELSE INPUT ">";Q$ ' .. PAUSE
- 207 IF Q$<>"END" THEN K%=0: GOTO 202
- 210 RETURN
- 247 '
- 248 ' ***** UPDATE RECORD
- 249 '
- 250 INPUT "SS#";A$: IF A$="END" THEN 270
- 252 II%=5:GOSUB 2000 ' .. FETCH RECORD TO BE UPDATED
- 254 IF RC%=1 THEN PRINT "** ERROR - RECORD DOES NOT EXIST":GOTO 250
- 255 PRINT "NAME: /";NM$;"/";: INPUT F$: IF LEN(F$)<>0 THEN LSET NM$=F$
- 257 PRINT "BIRTH DATE: /";BD$;"/";: INPUT F$: IF LEN(F$)<>0 THEN LSET BD$=F$
- 258 PRINT "SEX: /";SX$;"/";: INPUT F$: IF LEN(F$)<>0 THEN LSET SX$=F$
- 260 PRINT "JOB CODE: /";JC$;"/";: INPUT F$: IF LEN(F$)<>0 THEN LSET JC$=F$
- 262 PRINT "STREET: /";A1$;"/";: INPUT F$: IF LEN(F$)<>0 THEN LSET A1$=F$
- 263 PRINT "CITY-STATE: /";A2$;"/";: INPUT F$: IF LEN(F$)<>0 THEN LSET A2$=F$
- 265 PRINT "ZIP CODE: /";ZP$;"/";: INPUT F$: IF LEN(F$)<>0 THEN LSET ZP$=F$
- 266 II%=3: GOSUB 2000 ' .. RESTORE UPDATED RECORD
- 268 PRINT " ": GOTO 250
- 270 RETURN
- 1995 '
- 1996 ' -------------------------------------------------------------------
- 1997 ' - FILE MANAGEMENT SUBROUTINES (II%,MX%,F1$,A$,PT%,PT$, NX%,RC%) -
- 1998 ' -------------------------------------------------------------------
- 1999 '
- 2000 RC%=0: IF II%<1 OR II%>8 THEN RC%=1: RETURN
- 2001 IF II%=1 THEN 2006: ' ELSE STORE VARIABLES USED BY SUBROUTINES
- 2004 ZZ%(1)=J%: ZZ%(2)=JJ%: ZZ%(3)=K%:ZZ%(4)=LO%: ZZ%(5)=HI%: ZZ%(6)=Z%
- 2005 '
- 2006 ON II% GOSUB 2035,2080,2090,2100,2150,2200,2250,2280
- 2007 '
- 2008 IF II%=1 THEN 2010: ' ELSE RESTORE VARIABLES USED BY SUBROUTINES
- 2009 J%=ZZ%(1): JJ%=ZZ%(2): K%=ZZ%(3): LO%=ZZ%(4): HI%=ZZ%(5): Z%=ZZ%(6)
- 2010 RETURN
- 2034 REM --- (1) SUBROUTINE (MX%,F1$) --- INPUT POINTERS AND KEYS
- 2035 IF MX%<1 THEN RC%=1: RETURN
- 2037 MR%=(INT((MX%+2)/64)+1)*64
- 2038 DIM PT$(64),PT%(MR%),KE$(MX%),ZZ%(8)
- 2040 OPEN "R",#1,UA$+":"+F1$,128 ' INDEX FILE
- 2042 FOR J%=1 TO 64: FIELD #1,(J%-1)*2 AS DU$, 2 AS PT$(J%): NEXT J%
- 2050 K%=0: IF LOF(1)=0 THEN 2062
- 2051 FOR J%=1 TO INT(MR%/64)
- 2052 GET 1,J% ' .. INPUT RECORD CONTAINING 64 POINTERS
- 2054 FOR JJ%=1 TO 64: K%=K%+1: PT%(K%)=CVI(PT$(JJ%)): NEXT JJ%
- 2055 NEXT J%
- 2056 '
- 2057 IF PT%(MR%)=0 THEN 2062
- 2058 FOR J%=1 TO PT%(MR%)+PT%(MR%-1)
- 2059 GET 2, J%: KE$(J%)=KY$
- 2060 NEXT J%
- 2062 RETURN
- 2079 REM --- (2) SUBROUTINE (MR%,A$, RC%) -- ADD RECORD TO FILE
- 2080 GOSUB 2500 : IF K%>0 THEN RC%=1: GOTO 2088
- 2083 GOSUB 2520 : IF Z%>MR%-1 THEN RC%=2: GOTO 2088
- 2085 K%=-K%:GOSUB 2540 ' .. INSERT POINTER . PT%(K%)=Z%
- 2086 KE$(Z%)=A$
- 2087 PUT 2,Z% ' .. STORE NEW RECORD
- 2088 RETURN
- 2089 REM -- (3) SUBROUTINE --- REWRITE RECORD
- 2090 GOSUB 2500: IF K%<0 THEN RC%=1: GOTO 2098
- 2092 PUT 2,PT%(K%) ' .. STORE RECORD
- 2098 RETURN
- 2099 REM --- (4) SUBROUTINE (MR%,A$,RC%) --- DELETE A RECORD
- 2100 GOSUB 2500: IF K%<0 THEN RC%=1: GOTO 2110
- 2102 Z%=PT%(K%): IF K%=PT%(MR%) THEN 2107
- 2104 FOR J%=K% TO PT%(MR%)-1: PT%(J%)=PT%(J%+1): NEXT J%
- 2107 JJ%=PT%(MR%-1)
- 2108 PT%(PT%(MR%))=0: PT%(MR%)=PT%(MR%)-1: PT%(MR%-1)=JJ%+1:PT%(MR%-2-JJ%)=Z%
- 2110 RETURN
- 2149 REM --- (5) SUBROUTINE (MR%,A$,NX%,RC%) --- READ RECORD BY KEY
- 2150 GOSUB 2500: IF K%<0 THEN RC%=1: GOTO 2155
- 2152 GET 2,PT%(K%) '.. INPUT RECORD
- 2153 NX%=K%
- 2155 RETURN
- 2199 REM --- (6) SUBROUTINE (MR%,NX%,RC%) --- READ RECORD BY SEQUENCE
- 2200 IF NX%<0 OR NX%>PT%(MR%) THEN RC%=1: GOTO 2205
- 2203 GET 2, PT%(NX%)
- 2205 RETURN
- 2249 REM --- (7) SUBROUTINE (MR%) --- RESTORE POINTERS
- 2250 K%=0: Z%=INT((PT%(MR%)-1)/64)+1
- 2252 FOR J%=1 TO Z%
- 2253 FOR JJ%=1 TO 64: K%=K%+1:LSET PT$(JJ%)=MKI$(PT%(K%)): NEXT JJ%: PUT 1,J%
- 2254 NEXT J%
- 2255 K%=INT(MR%/64): IF Z%=K% THEN 2259
- 2257 K%=(K%-1)*64: FOR J%=1 TO 64: LSET PT$(J%)=MKI$(PT%(J%+K%)):NEXT J%:PUT 1,INT(MR%/64)
- 2259 RETURN
- 2279 REM --- (8) SUBROUTINE -- DISPLAY FILE STATISTICS
- 2280 PRINT " ":IF PT%(MR%)=0 THEN PRINT "** NO RECORDS IN FILE": GOTO 2290
- 2282 PRINT " ** FILE STATISTICS **": PRINT " "
- 2283 PRINT " 1. RECORDS IN FILE: ";PT%(MR%)
- 2284 PRINT " 2. DELETED RECORDS: ";PT%(MR%-1)
- 2285 PRINT " 3. LOWEST KEY: ";KE$(PT%(1))
- 2286 PRINT " 4. HIGHEST KEY: ";KE$(PT%(PT%(MR%)))
- 2287 PRINT " "
- 2290 RETURN
- 2498 '
- 2499 REM --- SUBROUTINE (MR%,A$, K%) -- BINARY SEARCH
- 2500 IF PT%(MR%)=0 THEN K%=-1: RETURN
- 2502 LO%=0: HI%=PT%(MR%)+1
- 2504 M%=INT((LO%+HI%)/2)
- 2505 IF A$=KE$(PT%(M%)) THEN K%=M%: GOTO 2510
- 2506 IF A$>KE$(PT%(M%)) THEN LO%=M%: ELSE HI%=M%
- 2508 IF LO%+1 <> HI% THEN 2504 ELSE K%=-HI%
- 2510 RETURN
- 2518 '
- 2519 REM -- SUBROUTINE (MR%,PT%,Z%) -- LOCATE FREE RECORD IN DATA FILE
- 2520 IF PT%(MR%-1)=0 THEN Z%=PT%(MR%)+1: GOTO 2530
- 2522 J%=PT%(MR%):JJ%=PT%(MR%-1)
- 2524 Z%=PT%(MR%-1-JJ%): PT%(MR%-1)=PT%(MR%-1)-1: PT%(MR%-1-JJ%)=0
- 2530 RETURN
- 2538 '
- 2539 REM -- SUBROUTINE (MR%,K%,Z%) -- INSERT POINTER INTO POINTER VECTOR
- 2540 IF K%=PT%(MR%)+1 THEN 2548
- 2542 FOR J%=PT%(MR%)+1 TO K%+1 STEP -1
- 2544 PT%(J%)=PT%(J%-1)
- 2545 NEXT J%
- 2548 PT%(K%)=Z%: PT%(MR%)=PT%(MR%)+1
- 2550 RETURN
- 2997 ' --------------------------------------------------------------------
- 2998 ' - PROGRAM TO INITIALIZE INDEX FILE -
- 2999 ' --------------------------------------------------------------------
- 3000 PRINT " ":PRINT TAB(5);"** INITIALIZE INDEX FILE **":PRINT " "
- 3001 INPUT "> DRIVE TO CONTAIN DATA";UA$
- 3002 INPUT "> FILE NAME";F$
- 3004 INPUT "> MAXIMUM NUMBER OF RECORDS FILE WILL HOLD";MX%
- 3006 MR%=(INT((MX%+2)/64)+1)*64
- 3008 DIM PT$(64)
- 3009 '--------------------------- OPEN FILE AND SET POINTERS TO 0
- 3010 OPEN "R",#1,UA$+":"+F$,128
- 3012 FOR J%=1 TO 64: FIELD #1,(J%-1)*2 AS DU$,2 AS PT$(J%):NEXT J%
- 3014 ZR$=MKI$(0): FOR J%=1 TO 64: LSET PT$(J%)=ZR$: NEXT J%
- 3015 '--------------------------- STORE BLOCKS OF ZERO POINTERS
- 3016 FOR J%=1 TO MR%/64
- 3018 PUT 1,J%
- 3020 NEXT J%
- 3022 PRINT " ": PRINT " INITIALIZATION COMPLETE ON DRIVE";UA$
- 3025 END